/*--------------------------------------------------------------------------------*/
#ifndef __MAP__
#define __MAP__
/*--------------------------------------------------------------------------------*/
#include "primitives.h"
#include "object.h"
#include "util.h"
#include "debug.h"
#include <map>
/*--------------------------------------------------------------------------------*/
template< class _CLASS_KEY_, class _CLASS_VAR_ >
class MAP
{

	// -- PUBLIC

public:

    // .. CONSTRUCTORS

    MAP() : Map()
    {

    }

    ~MAP()
    {
     
    }

    // .. METHODS

    VOID Add( const _CLASS_KEY_ & key, const _CLASS_VAR_ & var )
    {
    	DEBUG_Require( Map.find( key ) == Map.end() );

    	Map[ key ] = var;
    }

    VOID Clear()
    {
        Map.clear();
    }

    COUNT GetItemCount() const
    {
        return ( COUNT ) Map.size();
    }

    BOOL HasKey( const _CLASS_KEY_ & key ) const
    {
    	return ( Map.find( key ) != Map.end() );
    }

    // .. OPERATORS

    _CLASS_VAR_ & operator[]( const _CLASS_KEY_ & key )
    {
    	DEBUG_Require( Map.find( key ) != Map.end() );

        return Map[ key ];
    }

    const _CLASS_VAR_ & operator[]( const _CLASS_KEY_ & key ) const
    {
    	DEBUG_Require( Map.find( key ) != Map.end() );

    	typename std::map<_CLASS_KEY_,_CLASS_VAR_>::const_iterator it = Map.find( key );

    	return it->second;
    }

    // -- PRIVATE

private :

    // .. ATTRIBUTES

    std::map< _CLASS_KEY_ , _CLASS_VAR_ >
		Map;
};
/*--------------------------------------------------------------------------------*/
#endif
